package com.jsd.executors;

import java.util.concurrent.*;

/**
 * Executors 工具类、3方法
 * new ThreadPoolExecutor.AbortPolicy() 超出的不处理，并且抛出异常
 * new ThreadPoolExecutor.CallerRunsPolicy() 哪里来的会那里去
 * new ThreadPoolExecutor.DiscardPolicy() 丢掉任务，不抛出异常
 * new ThreadPoolExecutor.DiscardOldestPolicy() 超出时，尝试与最早的线程争取
 */
public class Demo02 {

    public static void main(String[] args) {

        System.out.println(Runtime.getRuntime().availableProcessors());
        /**
         * maximumPoolSize怎么定义
         * cpu密集型 采用cpu线程数来定义
         * io密集数 采用大于io任务的数的数量来定义
         */
        // 线程池
        ExecutorService threadPool = new ThreadPoolExecutor(
                // 初始线程数
                2,
                // 最大线程数
                Runtime.getRuntime().availableProcessors(),
                // 超时时间
                3,
                // 超时时间单位
                TimeUnit.SECONDS,
                // 阻塞队列
                new LinkedBlockingDeque<>(3),
                // 线程池工厂
                Executors.defaultThreadFactory(),
                // 拒绝策略
                new ThreadPoolExecutor.CallerRunsPolicy());

        try {
            for (int i = 0; i < 10; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + " ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 线程池用完要关闭线程池
            threadPool.shutdown();
        }
    }
}
